/*
 * SoftwareSAR - 1.0
 */
package br.com.cpqd.ssar.mediador;

import br.com.cpqd.ssar.utilitarias.Material;
import java.awt.Color;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.StringTokenizer;
import javax.swing.DefaultComboBoxModel;

/**
 * Classe que Controla a Lista de Materiais Cadastrados
 * @author Rafael Buck
 * @version 1.3
 */
public class ControladorMateriais {

    /**
     * Modelo para apresentação na Combo Box
     * Guarda a lista de materiais cadastrados pelo software e pelo usuário
     */
    private DefaultComboBoxModel modelo;
    /**
     * Modelo para apresentação na Combo Box
     * Guarda a lista de materiais cadastrados pelo usuário
     */
    private DefaultComboBoxModel modeloEditavel;

    /**
     * Método Construtor
     */
    public ControladorMateriais() {
        // Carrega Arquivos de Materiais do Programa
        modelo = new DefaultComboBoxModel();
        modeloEditavel = new DefaultComboBoxModel();
        String caminho = System.getProperty("user.dir") + File.separator + "materiais.dat";
        try {
            FileInputStream inputStream = new FileInputStream(caminho);
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            //Descarta as duas primeiras linhas
            reader.readLine();
            reader.readLine();

            int R, G, B;
            String str = null;
            StringTokenizer st = null;
            Material novoMaterial = null;

            // Le enquanto ha materiais
            while ((str = reader.readLine()) != null) {
                // Tokens
                st = new StringTokenizer(str);
                // Cria um Novo Material
                novoMaterial = new Material(false);
                // Seta seus Atributos
                novoMaterial.setId(Integer.valueOf(st.nextToken()));
                novoMaterial.setPermissividade(Double.valueOf(st.nextToken()));
                novoMaterial.setPermeabilidade(Double.valueOf(st.nextToken()));
                novoMaterial.setCondutividade(Double.valueOf(st.nextToken()));
                novoMaterial.setPerdaMagnetica(Double.valueOf(st.nextToken()));
                novoMaterial.setDensidadeEspecifica(Double.valueOf(st.nextToken()));
                novoMaterial.setNome(st.nextToken());
                R = Integer.valueOf(st.nextToken());
                G = Integer.valueOf(st.nextToken());
                B = Integer.valueOf(st.nextToken());
                Color cor = new Color(R, G, B);
                novoMaterial.setCor(cor);
                // Adiciona ao Modelo
                if (!this.idExiste(novoMaterial.getId())) {
                    modelo.addElement(novoMaterial);
                }
            }
            reader.close();
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // Carrega Arquivos de Materiais do Usuário
        caminho = System.getProperty("user.dir") + File.separator + "DadosUsuarios" + File.separator + "materiais.dat";
        try {
            FileInputStream inputStream = new FileInputStream(caminho);
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            //Descarta as duas primeiras linhas
            reader.readLine();
            reader.readLine();

            int R, G, B;
            String str = null;
            StringTokenizer st = null;
            Material novoMaterial = null;

            // Le enquanto ha materiais
            while ((str = reader.readLine()) != null) {
                // Tokens
                str = str.replace(",", " ");
                st = new StringTokenizer(str);
                // Cria um Novo Material
                novoMaterial = new Material(true);
                // Seta seus Atributos
                //System.out.println("M::: " + st.nextToken());
                novoMaterial.setId(Integer.valueOf(st.nextToken().toString()));
                novoMaterial.setPermissividade(Double.valueOf(st.nextToken()));
                novoMaterial.setPermeabilidade(Double.valueOf(st.nextToken()));
                novoMaterial.setCondutividade(Double.valueOf(st.nextToken()));
                novoMaterial.setPerdaMagnetica(Double.valueOf(st.nextToken()));
                novoMaterial.setDensidadeEspecifica(Double.valueOf(st.nextToken()));
                novoMaterial.setNome(st.nextToken());
                R = Integer.valueOf(st.nextToken());
                G = Integer.valueOf(st.nextToken());
                B = Integer.valueOf(st.nextToken());
                Color cor = new Color(R, G, B);
                novoMaterial.setCor(cor);
                // Adiciona ao Modelo
                if (!this.idExiste(novoMaterial.getId())) {
                    modelo.addElement(novoMaterial);
                    modeloEditavel.addElement(novoMaterial);
                }
            }
            reader.close();
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * Verifica se o ID já existe, para evitar duplicatas
     * @param id int
     * @return boolean
     */
    public boolean idExiste(int id) {
        int i = 0;
        while (i < modelo.getSize()) {
            Material material = (Material) modelo.getElementAt(i);
            if (material.getId() == id) {
                return true;
            }
            i++;
        }
        return false;
    }

    /**
     * Rotina que Salva os Dados no Arquivo materiais.dat do Usuário
     */
    public void salvaDadosArquivo() {
        // Carrega Arquivos de Materiais do Usuário
        String cabecalho1 = "/** Sequencia dos valores:";
        String cabecalho2 = "/** id / permissividade / permeabilidade / condutividade / perda magnetica / densidade especifica / nome / cor: R G B";
        String caminho = System.getProperty("user.dir") + File.separator + "DadosUsuarios" + File.separator + "materiais.dat";
        try {
            FileWriter writer = new FileWriter(caminho);
            PrintWriter pw = new PrintWriter(new BufferedWriter(writer));

            // Imprime Primeiro Cabeçalho
            pw.println(cabecalho1);
            // Imprime Segundo Cabeçalho
            pw.println(cabecalho2);

            int i = 0;
            while (i < modeloEditavel.getSize()) {
                Material material = (Material) modeloEditavel.getElementAt(i);
                pw.print(String.valueOf(material.getId()));
                pw.print("\t" + String.valueOf(material.getPermissividade()));
                pw.print("\t" + String.valueOf(material.getPermeabilidade()));
                pw.print("\t" + String.valueOf(material.getCondutividade()));
                pw.print("\t" + String.valueOf(material.getPerdaMagnetica()));
                pw.print("\t" + String.valueOf(material.getDensidadeEspecifica()));
                pw.print("\t" + String.valueOf(material.getNome()));
                pw.print("\t" + String.valueOf(material.getCor().getRed()));
                pw.print("\t" + String.valueOf(material.getCor().getGreen()));
                pw.println("\t" + String.valueOf(material.getCor().getBlue()));
                i++;
            }

            pw.close();
            writer.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * Verifica se o nome de material já existe, para evitar duplicatas
     * @param nome String
     * @return boolean
     */
    public boolean materialExiste(String nome) {
        int i = 0;
        while (i < modelo.getSize()) {
            Material material = (Material) modelo.getElementAt(i);
            if (nome.equalsIgnoreCase(material.getNome())) {
                return true;
            }
            i++;
        }
        return false;
    }

    /**
     * Remove Material
     * @param material Material
     */
    public void removerMaterial(Material material) {
        modeloEditavel.removeElement(material);
        modelo.removeElement(material);
        this.salvaDadosArquivo();
    }

    /**
     * Adiciona Material
     * @param material Material
     */
    public void adicionaMaterial(Material material) {
        int i;
        for (i = 1; idExiste(i); i++);
        material.setId(i);
        modelo.addElement(material);
        modeloEditavel.addElement(material);
        this.salvaDadosArquivo();
    }

    /**
     * Obtém determinado Material dado seu ID
     * @param id int
     * @return Material
     */
    public Material getMaterial(int id) {
        int i = 0;
        while (i < modelo.getSize()) {
            Material material = (Material) modelo.getElementAt(i);
            if (material.getId() == id) {
                return material;
            }
            i++;
        }
        return null;
    }

    /**
     * Get the value of modelo
     * @return the value of modelo
     */
    public DefaultComboBoxModel getModelo() {
        return modelo;
    }

    /**
     * Get the value of modeloEditavel
     * @return the value of modeloEditavel
     */
    public DefaultComboBoxModel getModeloEditavel() {
        return modeloEditavel;
    }
}
